<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>03_Object扩展</title>
</head>
<body>
<!--
ES5给Object扩展了一些静态方法, 常用的2个:
1. Object.create(prototype, [descriptors])
  * 作用: 以指定对象为原型创建新的对象
  * 为新的对象指定新的属性, 并对属性进行描述
    - value : 指定值
    - writable : 标识当前属性值是否是可修改的, 默认为false
    - configurable: 标识当前属性是否可以被删除 默认为false
    - enumerable： 标识当前属性是否能用for in 枚举 默认为false
2. Object.defineProperties(object, descriptors)
  * 作用: 为指定对象定义扩展多个属性
    * get ：用来获取当前属性值得回调函数
    * set ：修改当前属性值得触发的回调函数，并且实参即为修改后的值
   * 存取器属性：setter,getter一个用来存值，一个用来取值
-->
<script type="text/javascript">
    var obj = {username: 'kobe', age: 30};
    var obj1 = Object.create(obj, {
        sex: {
            value: '男',
            writable: true,
            configurable: true,
            enumerable: true
        }
    });
    console.log(obj1.username);
    console.log(obj1.sex);
    obj1.sex = '女';
    console.log(obj1.sex);
    // delete obj1.sex;
    // console.log(obj1);
    for (var i in obj1) {
        console.log(i);
    }

    //Object.defineProperties(object, descriptors)
    var obj2 = {firstName: 'kobe', lastName: 'bryant'};
    Object.defineProperties(obj2, {
        fullName: {
            get: function () { //获取拓展属性的值
                console.log('get()');
                return this.firstName + ' ' + this.lastName;
            },
            set: function (data) { //监听拓展属性
                var names = data.split(' ');
                this.firstName = names[0];
                this.lastName = names[1];
            }
        }
    });
    console.log(obj2.fullName);
    obj2.fullName = 'tim ducan';
    console.log(obj2.fullName);
    console.log(obj2.firstName);
</script>
</body>
</html>